<?php

namespace Pinenut\Model2\Embedded;

use Pinenut\Model2\Embedded;
use Pinenut\Model2;
use Pinenut\Log;
/**
 * Связь
 * 
 * @author kosh
 */
class Reference extends Embedded {
	
	// идентификатор
	public $_ref;
	
	/**
	 * связанная сущность, если она загружена
	 * @var Model2
	 */
	protected $_entity;
	
	/**
	 * @var ReferenceContainer
	 */
	protected $_parent = null;
	
	protected $_params = [];
	
	function __construct(Embedded $parent = null, $field = null, array $params = []) {
		parent::__construct($parent, $field);
		// параметры
		$this->_params = $params;
	}
	
	
	function fields() {
		return array_merge(parent::fields(), array(
			'_ref'=>static::ID,
		));
	}
	
	// строка из поддокумента - идентификатор связанной сущности
	function __toString() {
		return (string)$this->_ref;
	}
	
	/**
	 * Возвращаем связанную сущность
	 * Лениво её загружаем, если нет
	 */
	function getEntity() {
		if ($this->_ref && !$this->_entity) {
			$class = $this->_parent->getReferedClass();
			$this->_entity = $class::find($this->_ref);
		}
		return $this->_entity;
	}
	
	/** 
	 * Удаляем связанные сущности, если выставлен соответствующий парамерs
	 */
	public function afterRemove() {
		parent::afterRemove();
		// если в параметрах указано, что грохаем так же связанную сущность - делаем это :)
		if (isset($this->_params['removeEntity']) && $this->_params['removeEntity']) {
			$this->getEntity()->remove();
		}
	}
}